package Collection;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**
 * 排序自定义类型元素
 */
public class SortListDemo2 {
    public static void main(String[] args) {
        List<Point> list=new ArrayList<>();
        list.add(new Point(2,8));
        list.add(new Point(5,7));
        list.add(new Point(6,5));
        list.add(new Point(1,3));
        list.add(new Point(4,2));
        System.out.println(list);
        /*
         编译不通过的原因：
         Collections。sort（List list）该方法要求集合中的元素类型必须实现接口：
         Comparable ，该接口中有一个抽象方法compareTo，这个方法用来定义元素之间比较大小的
         规则，所有只有实现了该接口的元素才能利用这个方法比较出大小进而实现排序操作.

         当我们调用某个API时，它反过来要求我们为其修改其他额外的代码时就是侵入性。
         侵入性不利于程序后期的维护，应当在实际开发中尽量避免。
          */
       // Collections.sort(list);//编译不通过：compare（比较）comparable可以比较的
        /*
        Collections.sort（List list，Comparator c）\
        重载的sort方法要求我们在传入一个Comparator”比较器“，该比较器用来为集合元素
        临时定义一种比较规则，从而将List集合中的元素通过该比较器比较大小后进行排序。
        Comparator是一个接口，实际应用中我们需要实现该接口为集合运算提供比较规则。
         */
//        Comparator<Point> c =new Comparator<Point>() {
//            /**
//             * compare方法用来定义两个参数o1,o2的大小关系
//             * 返回值用来表示o1与o2的大小关系
//             * 当返回值>0时,应当表示的含义是o1>o2
//             * 当返回值<0时,表示o1<o2
//             * 当返回值=0时,表示o1与o2相等
//             */
//            @Override
//            public int compare(Point o1, Point o2) {
//                int olen1=o1.getX()*o1.getX()+o1.getY()*o1.getY();
//                int olen2=o2.getX()*o2.getX()+o2.getY()*o2.getY();
//                return olen1-olen2;
//            }
//        };
//        Collections.sort(list,c);
        Collections.sort(list, new Comparator<Point>() {
            @Override
            public int compare(Point o1, Point o2) {
                int olen1=o1.getX()*o1.getX()+o1.getY()*o1.getY();
                int olen2=o2.getX()*o2.getX()+o2.getY()*o2.getY();
                return olen1-olen2;
            }
        });
        System.out.println(list);
    }
}
